
/**
题目:
   给定一个单链表 L：L0→L1→…→Ln-1→Ln ，
   将其重新排列后变为： L0→Ln→L1→Ln-1→L2→Ln-2→…
   你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
   示例 1:
   给定链表 1->2->3->4, 重新排列为 1->4->2->3.
   示例 2:
   给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
思路:
    快慢指针找中点,反转,合并 注意将边界指针 设置为nil。
	本文是直接保存起来
效果:
     执行用时：12 ms, 在所有 Go 提交中击败了78.08%的用户
     内存消耗：5.3 MB, 在所有 Go 提交中击败了100.00%的用户                                   
*/
 
 
 /**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    void reorderList(ListNode* head) {
         if (!head) return;
            vector<ListNode*> vec;
            ListNode* cur = head;

            while (cur) {
                vec.push_back(cur);
                cur = cur->next;
            }

            int left = 0;
            int right = vec.size() - 1;
            while (left < right) {
                vec[left]->next = vec[right];
                vec[right--]->next = vec[++left];
            }
            vec[left]->next = nullptr;
        }
};